package com.bw.Threads;

import org.junit.Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Threads {
/**
 * 线程的一些概念：
 * sleep 睡眠
 * start启动线程
 * run线程启动后可以调用run这个方法
 * join等待本线程执行结束  别的线程才能继续执行
 * yield暂停线程 使线程进入就绪状态
 * setDeamon 守护线程  比如jvm的垃圾回收器   和redis中的&
 * interrupt 中断线程  不是真正的中断  比如wait线程后再使用interrupt会开启线程
 *
 * wait线程休眠 waitAll所有线程休眠
 * notify唤醒线程 notifyAll唤醒所有线程
 *
 */
    /**
     * 线程池的应用   我们使用executors来创建线程
     */
    /**
     * 一个普通的线程
     */
    @Test
    public void getThread(){
        for (int i=0; i<10000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            }).start();
        }
    }

    /**
     * 带有缓存的线程池    如果池中的线程一秒内没有被调用会自动被销毁
     */
    @Test
    public void getNewCachedThreadPool(){
        final ExecutorService service =   Executors.newCachedThreadPool();
        for(int i=0;i<10000;i++){
            service.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            });
        }
    }

    /**
     * 线程池中有固定的线程个数
     */
    @Test
    public void newFixedThreadPool(){
        ExecutorService service = Executors.newFixedThreadPool(3);
        for(int i=0;i<10000;i++) {
            service.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            });
        }
    }

    /**
     * 带有任务的线程   比如几秒内有几个线程在跑 支持定时和周期性任务
     */
    @Test
    public void newScheduledThreadPool(){
        ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
        for(int i=0;i<10000;i++){
            service.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            },3,2, TimeUnit.MILLISECONDS);
        }
    }
    @Test
    public void newSingleThreadPool(){

    }
}
